package view.indice;

import extended.ExtJoueur;
import generated.Indice;
import generated.Partie;

import java.awt.Font;


import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;

import javax.swing.Box;
import javax.swing.JButton;

import model.Maker;


/**
 * @author C-Net
 * Panel contenant la liste des indices de la partie
 */
public class JPIndiceListe extends javax.swing.JPanel implements MouseListener, ActionListener{


	private static final long serialVersionUID = 1916453915184534944L;
	private JPIndice jpIndice ;
	private JLabel lblTitreListe;
	private String[] tableau = {"Nom", "Description","id_Idince"};
	private String[] tableau1 = {"Nom du joueur","id_Joueur"};
	private DefaultTableModel model = new DefaultTableModel(null,tableau);
	private DefaultTableModel model1 = new DefaultTableModel(null,tableau1);
	private JTable jTListe = new JTable(model);
	private JTable jTListeJ = new JTable(model1);
	private JScrollPane jSPListe;
	private Component verticalStrut;
	private JScrollPane jSPListeJ;

	private Box verticalBox;
	private JButton btnAjoutDecouvert;
	private JButton btnAjoutDecouvrir;
	private Component verticalStrut_1;

	
	public JPIndiceListe(JPIndice jpIndice) {
		super();
		this.jpIndice = jpIndice ;
		initGUI();
	}
	
	private void initGUI() {
		try {
			GridBagLayout gridBagLayout = new GridBagLayout();
			gridBagLayout.columnWidths = new int[]{452, 0, 0};
			gridBagLayout.rowHeights = new int[]{32, 0, 0, 185, 0, 0, 0, 0};
			gridBagLayout.columnWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
			gridBagLayout.rowWeights = new double[]{0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
			setLayout(gridBagLayout);
			
			lblTitreListe = new JLabel();
			GridBagConstraints gbc_lblTitreListe = new GridBagConstraints();
			gbc_lblTitreListe.gridwidth = 2;
			gbc_lblTitreListe.anchor = GridBagConstraints.NORTH;
			gbc_lblTitreListe.insets = new Insets(0, 0, 5, 0);
			gbc_lblTitreListe.gridx = 0;
			gbc_lblTitreListe.gridy = 0;
			this.add(lblTitreListe, gbc_lblTitreListe);
			lblTitreListe.setText("Liste des indices");
			lblTitreListe.setFont(new Font("Serif", Font.PLAIN, 24));
			
			verticalStrut = Box.createVerticalStrut(20);
			GridBagConstraints gbc_verticalStrut = new GridBagConstraints();
			gbc_verticalStrut.insets = new Insets(0, 0, 5, 5);
			gbc_verticalStrut.gridx = 0;
			gbc_verticalStrut.gridy = 1;
			add(verticalStrut, gbc_verticalStrut);
			
			jSPListe = new JScrollPane(jTListe);
			GridBagConstraints gbc_jSPListe = new GridBagConstraints();
			gbc_jSPListe.gridwidth = 2;
			gbc_jSPListe.insets = new Insets(0, 0, 5, 0);
			gbc_jSPListe.fill = GridBagConstraints.BOTH;
			gbc_jSPListe.gridx = 0;
			gbc_jSPListe.gridy = 2;
			this.add(jSPListe, gbc_jSPListe);
			jSPListe.setBounds(0, 60, 730, 670);
			jTListe.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			
			
			jSPListeJ = new JScrollPane(jTListeJ);
			GridBagConstraints gbc_jSPListeJ = new GridBagConstraints();
			gbc_jSPListeJ.insets = new Insets(0, 0, 5, 5);
			gbc_jSPListeJ.gridheight = 2;
			gbc_jSPListeJ.fill = GridBagConstraints.BOTH;
			gbc_jSPListeJ.gridx = 0;
			gbc_jSPListeJ.gridy = 3;
			this.add(jSPListeJ, gbc_jSPListeJ);
			jSPListeJ.setBounds(0, 60, 730, 670);
			
			
						jTListeJ.addMouseListener(this);
						
						verticalBox = Box.createVerticalBox();
						GridBagConstraints gbc_verticalBox = new GridBagConstraints();
						gbc_verticalBox.insets = new Insets(0, 0, 5, 0);
						gbc_verticalBox.gridx = 1;
						gbc_verticalBox.gridy = 3;
						add(verticalBox, gbc_verticalBox);
						
						btnAjoutDecouvert = new JButton("<html>Ajouter dans \"d\u00E9couvert\"</html>");
						verticalBox.add(btnAjoutDecouvert);
						btnAjoutDecouvert.addActionListener(this);
						
						verticalStrut_1 = Box.createVerticalStrut(20);
						verticalBox.add(verticalStrut_1);
						
						btnAjoutDecouvrir = new JButton("<html>Ajouter dans \"a d\u00E9couvrir\"</html>");
						verticalBox.add(btnAjoutDecouvrir);
						btnAjoutDecouvrir.addActionListener(this);
			

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void afficherListe(){
		this.afficherListejoueur();
		Partie p = this.jpIndice.getCtrIndice().getCtrPartie().getPartie();
		int i = 0;
		this.model= new DefaultTableModel(null,tableau);
		while (i < p.getIndice().size()){
			String[] tab = {p.getIndice().get(i).getNomIndice(), 
							p.getIndice().get(i).getDescriptionIndice(), 
							String.valueOf(p.getIndice().get(i).getIdIndice())};
			this.model.addRow(tab);		
			i++;
		}
		
		jTListe.setModel(this.model);
		jTListe.getColumnModel().getColumn(2).setMinWidth(0);
		jTListe.getColumnModel().getColumn(2).setMaxWidth(0);
		jTListe.repaint();
		jTListe.getTableHeader().setReorderingAllowed(false);
		
	}
	
	public void afficherListejoueur(){
		Partie p = this.jpIndice.getCtrIndice().getCtrPartie().getPartie();
		int i = 0;
		this.model1= new DefaultTableModel(null,tableau1);
		while (i < p.getJoueur().size()){
			String[] tab = {p.getJoueur().get(i).getNomJoueur(),
							String.valueOf(p.getJoueur().get(i).getIdJoueur())};
			this.model1.addRow(tab);		
			i++;
		}
		
		jTListeJ.setModel(this.model1);
		jTListeJ.getColumnModel().getColumn(1).setMinWidth(0);
		jTListeJ.getColumnModel().getColumn(1).setMaxWidth(0);
		jTListeJ.repaint();
		jTListeJ.getTableHeader().setReorderingAllowed(false);
	}
	
	public String getSelectedIndice(){
		int ligne = jTListe.getSelectedRow();
		return (String) jTListe.getValueAt(ligne, 2);
	}
	public String[] getSelectedJoueurs(){
		int[] tabjoueur = jTListeJ.getSelectedRows();
		String[] Str = new String[tabjoueur.length];
		for (int i = 0 ; i<tabjoueur.length ; i++){
			Str[i] = String.valueOf(jTListeJ.getValueAt(tabjoueur[i], 1));
		}
		return Str ;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {

		if (e.getSource()== btnAjoutDecouvert){
			gererTransfertDecouvert();
		}
		if (e.getSource()== btnAjoutDecouvrir){
			gererTransfertDecouvrir();
		}	
	}
	
	
	public void gererTransfertDecouvrir(){
		
		Partie p = this.jpIndice.getCtrIndice().getCtrPartie().getPartie();
		Indice I = Maker.createIndice();
		
		String idindice = getSelectedIndice();
		String[] idjoueur = getSelectedJoueurs();
				
		for(int h = 0; h < p.getIndice().size(); h++){
			if (p.getIndice().get(h).getIdIndice() == Integer.parseInt(idindice)){
				I = p.getIndice().get(h);
			}
		}	
		for(int i = 0; i < idjoueur.length ; i++){
			ExtJoueur j = this.jpIndice.getCtrIndice().getCtrPartie().getCtrJoueur().chercherJoueur(idjoueur[i]);
			boolean dejaPresent = false;
			for (int l = 0 ;  l<j.getIndiceNonDecouvert().size(); l++){
				if (I.getIdIndice() == j.getIndiceNonDecouvert().get(l).getIdIndice()){
					dejaPresent = true ;
				}
			}
			for (int l = 0 ;  l<j.getIndiceDecouvert().size(); l++){
				if (I.getIdIndice() == j.getIndiceDecouvert().get(l).getIdIndice()){
					dejaPresent = true ;
				}
			}
			if (!dejaPresent){
				List<Indice> indiceADecouvrir = j.getIndiceNonDecouvert();
				indiceADecouvrir.add(I);
				
				try {
					
					
					this.jpIndice.getCtrIndice().getCtrPartie().getCtrJoueur().modifierJoueur(
									j.getJoueur().getIdJoueur(), j.getNomJoueur(), j.getPwdJoueur(), 
									j.getJoueur().getBackground(),j.getJoueur().getObjectif(), j.getChronoJoueur(), 
									j.getIndiceDecouvert(), indiceADecouvrir);
					
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}		
	}
	
	public void gererTransfertDecouvert(){
		Partie p = this.jpIndice.getCtrIndice().getCtrPartie().getPartie();
		Indice I = Maker.createIndice();
		
		String idindice = getSelectedIndice();
		String[] idjoueur = getSelectedJoueurs();
				
		for(int h = 0; h < p.getIndice().size(); h++){
			if (p.getIndice().get(h).getIdIndice() == Integer.parseInt(idindice)){
				I = p.getIndice().get(h);
			}
		}	
		for(int i = 0; i < idjoueur.length ; i++){
			ExtJoueur j = this.jpIndice.getCtrIndice().getCtrPartie().getCtrJoueur().chercherJoueur(idjoueur[i]);
			boolean dejaPresent = false;
			for (int l = 0 ;  l<j.getIndiceDecouvert().size(); l++){
				if (I.getIdIndice() == j.getIndiceDecouvert().get(l).getIdIndice()){
					dejaPresent = true ;
				}
			}
			for (int l = 0 ;  l<j.getIndiceNonDecouvert().size(); l++){
				if (I.getIdIndice() == j.getIndiceNonDecouvert().get(l).getIdIndice()){
					dejaPresent = true ;
				}
			}
			if (!dejaPresent){
				List<Indice> indiceDecouvert = j.getIndiceDecouvert();
			    indiceDecouvert.add(I);
				try {
					this.jpIndice.getCtrIndice().getCtrPartie().getCtrJoueur().modifierJoueur(
									j.getJoueur().getIdJoueur(), j.getNomJoueur(), j.getPwdJoueur(), 
									j.getJoueur().getBackground(),j.getJoueur().getObjectif(), j.getChronoJoueur(), 
									indiceDecouvert, j.getIndiceNonDecouvert());
					
					if (this.jpIndice.getCtrIndice().getCtrPartie().getCtrChrono().enCours()){
						this.jpIndice.getCtrIndice().getCtrPartie().getSender().sendOrder("indice,supprimerliste," + String.valueOf(j.getJoueur().getIdJoueur()));
						for(int k = 0 ; k < j.getIndiceDecouvert().size(); k++){
							this.jpIndice.getCtrIndice().getCtrPartie().getSender().sendOrder("indice,ajouterindjoueur,"+String.valueOf(
									j.getIndiceDecouvert().get(k).getIdIndice()) + "," + String.valueOf(j.getJoueur().getIdJoueur()));
						}
						
					}
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		if (e.getClickCount()==2){
			this.jpIndice.affichageAfficher();
		}
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}


}